package com.bestcem.xm.user.service;

import com.alibaba.fastjson.JSONObject;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.component.security.dto.TokenDTO;
import com.bestcem.xm.user.controller.vo.group.UserGroupLevelOldVO;
import com.bestcem.xm.user.entity.pojo.UserGroupLevelDO;
import com.bestcem.xm.user.service.dto.group.*;

import java.util.List;

/**
 * 用户层级service
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2021/12/29 17:47
 */
public interface UserGroupLevelService {

    /**
     * 新增层级
     *
     * @param dto 新增层级参数
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2021/12/29 18:30
     */
    ServiceResult<String> insert(UserGroupLevelDTO dto);

    /**
     * 批量新增层级
     *
     * @param dtos 新增层级参数集合
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2021/12/29 18:30
     */
    ServiceResult<Boolean> insertBatch(List<UserGroupLevelDTO> dtos);

    /**
     * 通过id删除层级
     *
     * @param ids 层级id集合
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2021/12/29 18:30
     */
    ServiceResult<Integer> deleteByIds(List<String> ids);

    /**
     * 通过orgId查询所有层级
     *
     * @param orgId orgId
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2021/12/29 18:30
     */
    ServiceResult<List<UserGroupLevelDTO>> listByOrgId(String orgId);

    /**
     * 根据层级id查询层级信息
     *
     * @param id 层级id
     * @return 层级信息
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 15:53
     */
    ServiceResult<UserGroupLevelDTO> getById(String id);

    /**
     * 保存当前公司下用户组层级列表
     *
     * @param levelDTO 组织层级结构
     * @return
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2021/12/30 16:53
     */
    ServiceResult<Boolean> saveGroupLevel(SaveGroupLevelDTO levelDTO);


    /**
     * 批量设置层级显示字段
     *
     * @param displayDTOList 显示字段
     * @param currentToken   当前token
     * @return com.bestcem.xm.util.XmResultJson<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 23:18
     */
    ServiceResult<Object> setLevelDisplay(List<DisplayDTO> displayDTOList, TokenDTO currentToken);

    /**
     * 查询层级列表【包含显示字段】
     *
     * @param currentToken token信息
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupLevelDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/29 17:31
     */
    ServiceResult<List<UserGroupLevelDTO>> getLevelsAndDisplay(TokenDTO currentToken, Boolean all);

    /**
     * 批量保存用户组层级的的显示设置
     *
     * @param displayDTOList 组织层级显示列表
     * @return
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2021/12/30 16:53
     */
    ServiceResult<Integer> saveGroupLevelDisplay(List<SaveLevelDisplayDTO> displayDTOList);

    /**
     * 查询当前公司下用户组层级列表
     *
     * @param orgId 组织Id
     * @return 用户组层级列表
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2021/12/30 16:53
     */
    ServiceResult<List<UserGroupLevelDO>> getGroupLevelDisplay(String orgId);

    /**
     * 新增，编辑，删除层级
     *
     * @param groupLevel 层级数据
     * @param orgId      组织id
     * @param userId     用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:13
     */
    ServiceResult<Boolean> updateGroupLevel(UpdateGroupLevelDTO groupLevel, String orgId, String userId);


    ServiceResult<Integer> updateLevel(UserGroupLevelDTO groupLevelDTO);

    /**
     * 根据orgId查询门店的层级id
     *
     * @param orgId 租户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/11 20:45
     */
    ServiceResult<String> getStoreLevelId(String orgId);

    /**
     * 根据groupId查询它所在层级的levelNum
     *
     * @param groupParentId
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupLevelDTO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/16 11:19
     */
    ServiceResult<Integer> getLevelNumByIdJoinLevel(String groupParentId);

    /**
     * 根据orgId和层级名称查询层级信息
     *
     * @param orgId          租户id
     * @param groupLevelName 层级名称
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupLevelDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/23 13:46
     */
    ServiceResult<UserGroupLevelDTO> getGroupByOrgIdAndName(String orgId, String groupLevelName);

    /**
     * 通过id更新层级
     *
     * @param updateLevel 更新层级参数
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/2/28 10:30
     */
    ServiceResult<Integer> updateById(UserGroupLevelDTO updateLevel);


    /**
     * 获取某个组所在层级及以上层级，从高到低排列
     * 为空时返回所有层级，为currentuser时返回当前用户所在层级及以上层级
     *
     * @param groupId
     * @param orgCode
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.group.UserGroupLevelDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/11 17:48
     */
    ServiceResult<List<UserGroupLevelDTO>> getGroupLevelUpper(String groupId, String orgCode, String userId);

    /**
     * 查询公司层级列表
     *
     * @param orgId
     * @param groupLevelDTO
     * @return ServiceResult<List < UserGroupLevelDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/7/28 16:23
     */
    ServiceResult<List<UserGroupLevelDTO>> listByOrgId(String orgId, UserGroupLevelDTO groupLevelDTO);

    ServiceResult<List<UserGroupLevelOldVO>> getLevels(TokenDTO currentToken, String levelId);

    /**
     * 保存层级数据
     *
     * @param currentToken
     * @param levelId
     * @param jsonObject
     * @return
     */
    ServiceResult putGroupLevel(TokenDTO currentToken, String levelId, JSONObject jsonObject);
}
